package com.pkche.core.advanced.form;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.pkche.core.advanced.util.StringUtils;

/**
 * ajax提交表单的处理器 <br/>
 * Describe：封装ajax表单提交，由jquery.validation.js负责解析<br />
 * User："Qiang" <br/>
 * Time：2015年2月17日 下午11:29:24 <br/>
 */
public class AjaxSubmitValidator extends Validator {
	// 与jquery.validation.js中约定的各个属性的key名称
	public final static String KEY_SUCCEJS = "jsFunction";
	public final static String KEY_GO_PATH = "path";
	public final static String KEY_ERR_MAP = "err";
	public final static String DEFAULT_BOX_NAME = "___DEFAULT_BOX";
	private HttpServletRequest request;

	/**
	 * 构造一个验证处理器
	 * 
	 * @param req
	 */
	public AjaxSubmitValidator(HttpServletRequest req) {
		request = req;
	}

	// 成功执行方法
	private String succeJsFunction;
	// 失败执行方法
	private String unSucceJsFunction;
	// 跳转路径
	private String goPath;

	/**
	 * 指定控件值不能为Null
	 * 
	 * @param boxName
	 * @param msg
	 * @return
	 */
	public AjaxSubmitValidator notNull(String boxName, String msg) {
		String value = request.getParameter(boxName);
		if ((value == null) || (value.trim().length() == 0)) {
			this.err(boxName, msg);
		}
		return this;
	}

	/**
	 * 添加允许为空值的正则验证
	 * 
	 * @param boxName
	 * @param regex
	 * @param msg
	 * @return
	 */
	public AjaxSubmitValidator allowNullRegex(String boxName, String regex,
			String msg) {
		String value = request.getParameter(boxName);
		if (StringUtils.isNotEmpty(value)) {
			if (!regex(regex, value)) {
				super.err(boxName, msg);
			}
		}
		return this;

	}

	/**
	 * 指定控件值不能为0
	 * 
	 * @param boxName
	 * @param msg
	 * @return
	 */
	public AjaxSubmitValidator notZero(String boxName, String msg) {
		int value = Parse.toInt(request.getParameter(boxName));
		if (value == 0) {
			this.err(boxName, msg);
		}
		return this;
	}

	/**
	 * 如果验证通过，即passed()==true，跳转的目标路径
	 * 
	 * @param path
	 *            目标路径
	 * @return 当前验证器对象
	 */
	public AjaxSubmitValidator go(String path) {
		if (path.startsWith("/")) {
			// 根目录
			path = request.getContextPath() + path;
		}
		goPath = path;
		return this;
	}

	/**
	 * 如果验证通过，即passed()==true，需要执行的js方法(将覆盖go()方法)
	 * 
	 * @param fun
	 *            js方法名，或者js代码
	 * @return 当前验证器对象
	 */
	public AjaxSubmitValidator succeJs(String fun) {
		succeJsFunction = fun;
		return this;
	}

	/**
	 * 如果验证失败，即passed()==false，需要执行的js方法
	 * 
	 * @param fun
	 *            js方法名或者js代码
	 * @return
	 */
	public AjaxSubmitValidator unSucceJs(String fun) {
		unSucceJsFunction = fun;
		return this;
	}

	/**
	 * 显示一个警告消息，设置验证器最终的结果为失败
	 * 
	 * @param msg
	 *            消息描述
	 * @return
	 */
	public AjaxSubmitValidator alert(String msg) {
		validateMap.put(DEFAULT_BOX_NAME, msg);
		return this;
	}

	/**
	 * 返回json的验证描述
	 * 
	 * @return
	 */
	public String json() {
		Map<String, Object> map = new HashMap<String, Object>();
		if (this.passed()) {
			// 验证通过执行的方法
			if (this.succeJsFunction != null) {
				map.put(KEY_SUCCEJS, succeJsFunction);
			}
			// 验证通过跳转的路径
			if (this.goPath != null) {
				// path可能需要加上根目录
				map.put(KEY_GO_PATH, goPath);
			}
		} else {
			// 验证失败，添加错误描述
			map.put(KEY_ERR_MAP, this.validateMap);
			// 失败后尝试执行的js
			if (this.unSucceJsFunction != null) {
				map.put(KEY_SUCCEJS, unSucceJsFunction);
			}
		}
		// 将数据格式化json返回
		return StringUtils.toJSON(map);
	}

}
